package org.dtrd.modules.patient.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dtrd.config.wechat.entity.bean.officialaccount.WechatOfficialAccountUserInfo;
import org.dtrd.modules.common.entity.bean.PatientListInfo;
import org.dtrd.modules.common.entity.po.DtrdViewRlGroupPatient;
import org.dtrd.modules.patient.entity.bean.*;
import org.dtrd.modules.patient.entity.bean.miniprogram.PatientMiniProgramIndexInfo;
import org.dtrd.modules.patient.entity.bean.report.PatientArchive;
import org.dtrd.modules.patient.entity.po.DtrdEntRdPatient;
import org.dtrd.modules.patient.entity.request.PatientAllRequest;
import org.dtrd.modules.patient.entity.request.PatientIndexRequest;
import org.dtrd.modules.patient.entity.request.PatientRequest;
import org.dtrd.modules.questionnaire.entity.bean.ArchiveHomePageInfo;
import org.dtrd.modules.system.entity.bean.qiyeweixin.QwClientBaseInfo;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author 萧
 * @date 2021-09-26 23:31:52
 **/
public interface IDtrdEntRdPatientService extends IService<DtrdEntRdPatient> {

    List<Integer> getAllPatientIdList();

    PatientInfo selectOneByCondition(PatientRequest request);

    PatientInfo selectByPatientId(Integer patientId);

    DtrdEntRdPatient selectPoByPatientId(Integer patientId);

    DtrdEntRdPatient selectByUnionIdOrOpenIdOrWxOaOpenId(String unionId, String wxOaOpenId, String openId);

    PatientInfo selectByMobile(String mobile);

    /**
     * 通过微信
     */
    PatientInfo createPatientByWechatUserInfo(WechatOfficialAccountUserInfo userInfo);

    /**
     * 通过微信小程序openid和unionid创建用户
     *
     * @param openid
     * @param unionid
     * @return
     */
    DtrdEntRdPatient createPatientByOpenIdAndUnionid(String openid, String unionid);

    /**
     * 通过微信公众号的 openid 和 unionid 创建用户
     *
     * @param openid  微信公众号 openid
     * @param unionid unionid
     * @return 创建后的患者信息
     */
    DtrdEntRdPatient createPatientByOaOpenIdAndUnionid(String openid, String unionid);

    boolean updatePatientInfo(PatientInfo patientInfo, boolean fromWxApp);

    boolean isValidPatientId(Integer patientId);

    /**
     * 根据 groupId 分页查询患者信息
     */
    IPage<PatientPageInfo> getPatientListByGroupId(Integer pageNum, Integer pageSize, Integer groupId);

    /**
     * 绑定手机号码
     *
     * @param patientId
     * @param mobile
     * @return
     */
    Integer bindMobileToPatient(Integer patientId, String mobile);

    /**
     * 保存企微客户信息至用户表
     *
     * @param external_contact
     * @param mobile
     * @return
     */
    Integer syncQwClientInfo(QwClientBaseInfo external_contact, String mobile);

    /**
     * 查询患者公众号上的基本信息
     *
     * @param patientId 患者id
     * @return 基本信息
     */
    PatientPublicAccountInfo getPatientPublicAccountInfo(Integer patientId);

    /**
     * 查询患者公众号上的基本信息，通过手机号
     */
    PatientPublicAccountInfo getPatientPublicAccountInfo(String phoneNumber);

    /**
     * 获取患者首页统计部分信息
     *
     * @param patientId 患者id
     * @return 统计信息
     */
    PatientHomePageInfo getPatientHomePageInfo(Integer patientId);

    /**
     * 通过手机号进行默认注册
     *
     * @param phone 手机号
     */
    void registerDefaultPatient(String phone);

    /**
     * 更新或修改患者公众号信息
     *
     * @param patientPublicAccountInfo 患者信息对象
     * @return 操作结果
     */
    boolean saveOrUpdatePatientInfo(PatientPublicAccountInfo patientPublicAccountInfo);

    /**
     * 手机号是否为 patientId 的手机号
     */
    boolean checkPatientMobile(String mobile, Integer patientId);

    /**
     * 获取患者建档的首页信息
     */
    ArchiveHomePageInfo getPatientArchiveHomePageInfo(Integer patientId);

    /**
     * 更新患者的 unionid 和 openid
     */
    void updatePatientUnionIdAndWxOpenid(Integer patientId, String unionid, String openid);

    /**
     * 更新患者的 unionid 和 公众号的openid
     */
    void updatePatientUnionIdAndWxOaOpenid(Integer patientId, String unionid, String openid);

    /**
     * 获取患者小程序首页信息
     */
    PatientMiniProgramIndexInfo getPatientMiniProgramIndexInfo(Integer patientId);

    /**
     * 通过微信的身份信息更新patientId
     */
    void updatePatientInfoByWechatUserInfo(WechatOfficialAccountUserInfo userInfo, Integer patientId);

    /**
     * 查询患者列表
     */
    IPage<PatientListInfo> pagePatientInfo(Page<DtrdViewRlGroupPatient> page, String phone, String name, Integer groupId, Integer status, Date startDate, Date endDate, List<Integer> patientIds, String patientName, String patientMobile);

    IPage<PatientListInfo> selectPatientInfo(Page<DtrdViewRlGroupPatient> page, List<Integer> doctorIdList, Integer groupId, Integer status, Date startDate, Date endDate, List<Integer> patientIds, String patientName, String name, String patientMobile, String phone);

    /**
     * 获取患者首页表格部分信息
     */
    PatientIndexFormInfo getPatientIndexFormInfo(PatientIndexRequest request);

    PatientIndexFormInfo getPatientIndexFormInfoV2(PatientIndexRequest request);

    PatientIndexFormInfo getPatientIndexFormInfoV3(PatientIndexRequest request);

    List<DtrdEntRdPatient> listPatientsByIds(List<Integer> patientIds);

    /**
     * 获取患者 id：姓名的map
     */
    Map<Integer, String> getPatientIdToNameMap(List<Integer> patientIds);

    String getPatientOpenIdByPatientId(Integer patientId);

    String generateQrCode(Integer patientId);

    DtrdEntRdPatient getPatientInfoByUnionId(String unionid);

    /**
     * 扫描医生二维码
     *
     * @param userId
     * @param qrcodeUrl
     * @return
     */
    boolean onScanDoctorQrCode(Integer userId, String qrcodeUrl);

    /**
     * 根据工具箱
     * @param openid
     * @param unionid
     * @return
     */
    DtrdEntRdPatient createRecordByToolsId(String openid, String unionid);

    void updatePatientToolsInfo(Integer dataId, String unionid, String openid);

    /**
     * 获取所有患者
     * @return
     */
    IPage<PatientInfo> getAllPatients(PatientAllRequest request);

    BasePatientInfo getPatientBaseInfo(Integer patientId);
}
